﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Data;

using QLTTAN.BLL;
using QLTTAN.DTO;
namespace QLTTAN.Form
{
    public partial class frmLopHoc : DevExpress.XtraEditors.XtraForm
    {
        LopHocBLL LH_BLL;
        PhanCongBLL PC_BLL;
        ThoiGianHocBLL TGH_BLL;
        GiaoVienBLL GV_BLL;
        LoaiLopHocBLL LLH_BLL;
        PhongHocBLL PH_BLL;
        NgayHocBLL NH_BLL;
        CaHocBLL CH_BLL;

        public int MaLopSelected = -1;
        public int MaKhoaSelected = -1;

        DataTable dtGiaoVien;
        DataTable dtGiaoVienTemp;

        List<int> lstMaGiaoVienInsert;
        List<int> lstMaGiaoVienDelete;

        public frmLopHoc()
        {
            InitializeComponent();
        }

        private void FillDataInLookUpEditLoaiLopHoc()
        {
            lookUpEditLoaiLopHoc.Properties.DataSource = LLH_BLL.LoaiLopHoc_Load();
            lookUpEditLoaiLopHoc.Properties.ValueMember = "MaLoaiLop";
            lookUpEditLoaiLopHoc.Properties.DisplayMember = "TenLoaiLop";
        }

        private void FillDataInLookUpEditPhongHoc()
        {
            lookUpEditPhongHoc.Properties.DataSource = PH_BLL.PhongHoc_Load();
            lookUpEditPhongHoc.Properties.ValueMember = "MaPhong";
            lookUpEditPhongHoc.Properties.DisplayMember = "TenPhong";
        }

        private void FillDataInLookUpEditGiaoVien()
        {
            lookUpEditGiaoVien.Properties.DataSource = GV_BLL.GiaoVien_Load();
            lookUpEditGiaoVien.Properties.ValueMember = "MaGV";
            lookUpEditGiaoVien.Properties.DisplayMember = "TenGV";
        }



        private void FillDataInLookUpEditNgayHoc()
        {
            lookUpEditNgayHoc.Properties.DataSource = NH_BLL.NgayHoc_Load();
            lookUpEditNgayHoc.Properties.ValueMember = "MaNgayHoc";
            lookUpEditNgayHoc.Properties.DisplayMember = "DSNgayHoc";
        }

        private void FillDataInLookUpEditCaHoc()
        {
            lookUpEditCaHoc.Properties.DataSource = CH_BLL.CaHoc_Load();
            lookUpEditCaHoc.Properties.ValueMember = "MaCaHoc";
            lookUpEditCaHoc.Properties.DisplayMember = "ThoiGianBatDau";
        }

        private void CreateDataTableGiaoVien()
        {
            dtGiaoVien = new DataTable();
            dtGiaoVien.Columns.Add("MaGV", typeof(int));
            dtGiaoVien.Columns.Add("TenGV", typeof(string));

            gridCtrlGiaoVien.DataSource = dtGiaoVien;
        }

        private void CreateDataTableGiaoVienTemp(DataTable dt)
        {

            dtGiaoVienTemp = new DataTable();
            dtGiaoVienTemp.Columns.Add("MaGV", typeof(int));
            dtGiaoVienTemp.Columns.Add("TenGV", typeof(string));

            dtGiaoVienTemp = dt.Copy();
        }


        private void frmLopHoc_Load(object sender, EventArgs e)
        {
            LH_BLL = new LopHocBLL();
            PC_BLL = new PhanCongBLL();
            TGH_BLL = new ThoiGianHocBLL();
            GV_BLL = new GiaoVienBLL();
            LLH_BLL = new LoaiLopHocBLL();
            PH_BLL = new PhongHocBLL();
            NH_BLL = new NgayHocBLL();
            CH_BLL = new CaHocBLL();

            FillDataInLookUpEditLoaiLopHoc();
            FillDataInLookUpEditGiaoVien();
            FillDataInLookUpEditPhongHoc();
            FillDataInLookUpEditNgayHoc();
            FillDataInLookUpEditCaHoc();

            CreateDataTableGiaoVien();

            // Trường hợp chỉnh sửa thông tin lớp học => load lên thông tin lớp học cần chỉnh sửa.
            if(MaLopSelected != -1)
            {
                LopHocDTO LH_DTO = new LopHocDTO();
                LH_DTO.MaLop = MaLopSelected;

                try
                {
                    DataRow LopHocSelected = LH_BLL.LopHoc_GetInfo(LH_DTO);
                    txtMaLop.Text = LopHocSelected["MaLop"].ToString();

                    PhanCongDTO PC_DTO = new PhanCongDTO();
                    PC_DTO.MaLop = LH_DTO.MaLop;
                    dtGiaoVien = PC_BLL.PhanCong_Load(PC_DTO);
                    gridCtrlGiaoVien.DataSource = dtGiaoVien;
                    CreateDataTableGiaoVienTemp(dtGiaoVien);

                    lookUpEditLoaiLopHoc.ItemIndex = lookUpEditLoaiLopHoc.Properties.GetDataSourceRowIndex("TenLoaiLop", LopHocSelected["TenLoaiLop"]);
                    txtChuongTrinhHoc.Text = LopHocSelected["TenChuongTrinh"].ToString();
                    lookUpEditPhongHoc.ItemIndex = lookUpEditPhongHoc.Properties.GetDataSourceRowIndex("TenPhong", LopHocSelected["TenPhong"]);
                    dateNgayBatDau.EditValue = LopHocSelected["NgayBatDau"];
                    dateNgayKetThuc.EditValue = LopHocSelected["NgayKetThuc"];
                    lookUpEditNgayHoc.ItemIndex = lookUpEditNgayHoc.Properties.GetDataSourceRowIndex("DSNgayHoc", LopHocSelected["DSNgayHoc"]);
                    lookUpEditCaHoc.ItemIndex = lookUpEditCaHoc.Properties.GetDataSourceRowIndex("ThoiGianBatDau", LopHocSelected["ThoiGianBatDau"]);

                    lstMaGiaoVienInsert = new List<int>();
                    lstMaGiaoVienDelete = new List<int>();
                }
                catch (Exception ex)
                {
                    XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void btnLoaiLopHoc_Click(object sender, EventArgs e)
        {
            frmLoaiLopHoc frmLLH = new frmLoaiLopHoc();
            frmLLH.ShowDialog();
        }

        private void btnNgayHoc_Click(object sender, EventArgs e)
        {
            frmNgayHoc frmNH = new frmNgayHoc();
            frmNH.ShowDialog();
        }

        private void btnCaHoc_Click(object sender, EventArgs e)
        {
            frmCaHoc frmCH = new frmCaHoc();
            frmCH.ShowDialog();
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {
            string error = "";
            if(lookUpEditLoaiLopHoc.EditValue == null)
            {
                error += "Bạn chưa chọn tên lớp. \r\n";
            }
            if (gridViewGiaoVien.RowCount == 0)
            {
                error += "Bạn chưa chọn giáo viên. \r\n";
            }
            if (lookUpEditPhongHoc.EditValue == null)
            {
                error += "Bạn chưa chọn phòng học. \r\n";
            }
            if (dateNgayBatDau.Text.Trim().Equals(""))
            {
                error += "Bạn chưa chọn ngày bắt đầu. \r\n";
            }
            if (dateNgayKetThuc.Text.Trim().Equals(""))
            {
                error += "Bạn chưa chọn ngày kết thúc. \r\n";
            }
            if (lookUpEditNgayHoc.EditValue == null)
            {
                error += "Bạn chưa chọn ngày học. \r\n";
            }
            if (lookUpEditCaHoc.EditValue == null)
            {
                error += "Bạn chưa chọn ca học. \r\n";
            }

            if (!error.Equals(""))
            {
                XtraMessageBox.Show(error, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            LopHocDTO LH_DTO = new LopHocDTO();
            LH_DTO.MaLoaiLop = int.Parse(lookUpEditLoaiLopHoc.EditValue.ToString());
            LH_DTO.MaKhoaHoc = MaKhoaSelected;
            LH_DTO.MaPhongHoc = int.Parse(lookUpEditPhongHoc.EditValue.ToString());
            LH_DTO.NgayBatDau = (DateTime)dateNgayBatDau.EditValue;
            LH_DTO.NgayKetThuc = (DateTime)dateNgayKetThuc.EditValue;

            try
            {
                // Thêm Lớp Học.
                if (MaLopSelected == -1)
                {

                    if (LH_BLL.LopHoc_Insert(LH_DTO) > 0)
                    {
                        PhanCongDTO PC_DTO = new PhanCongDTO();
                        PC_DTO.MaLop = int.Parse(LH_BLL.LopHoc_GetLastID()[0].ToString());
                        for (int i = 0; i < gridViewGiaoVien.RowCount; i++)
                        {
                            PC_DTO.MaGV = int.Parse(gridViewGiaoVien.GetDataRow(i)["MaGV"].ToString());
                            PC_BLL.PhanCong_Insert(PC_DTO);
                        }

                        ThoiGianHocDTO TGH_DTO = new ThoiGianHocDTO();
                        TGH_DTO.MaLop = PC_DTO.MaLop;
                        TGH_DTO.MaNgayHoc = int.Parse(lookUpEditNgayHoc.EditValue.ToString());
                        TGH_DTO.MaCaHoc = int.Parse(lookUpEditCaHoc.EditValue.ToString());

                        TGH_BLL.ThoiGianHoc_Insert(TGH_DTO);

                        if (XtraMessageBox.Show("Lưu dữ liệu thành công.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
                            this.Close();
                    }
                        
                    else
                        XtraMessageBox.Show("Lưu dữ liệu thất bại.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    // Sửa Lớp Học.

                    LH_DTO.MaLop = int.Parse(txtMaLop.Text.Trim());

                    if (LH_BLL.LopHoc_Update(LH_DTO) > 0)
                    {
                        PhanCongDTO PC_DTO = new PhanCongDTO();
                        PC_DTO.MaLop = LH_DTO.MaLop;

                        foreach (int item in lstMaGiaoVienInsert)
                        {
                            PC_DTO.MaGV = item;

                            PC_BLL.PhanCong_Insert(PC_DTO);
                        }

                        foreach (int item in lstMaGiaoVienDelete)
                        {
                            PC_DTO.MaGV = item;

                            PC_BLL.PhanCong_Delete(PC_DTO);
                        }

                        ThoiGianHocDTO TGH_DTO = new ThoiGianHocDTO();
                        TGH_DTO.MaLop = LH_DTO.MaLop;
                        TGH_DTO.MaNgayHoc = int.Parse(lookUpEditNgayHoc.EditValue.ToString());
                        TGH_DTO.MaCaHoc = int.Parse(lookUpEditCaHoc.EditValue.ToString());

                        TGH_BLL.ThoiGianHoc_Update(TGH_DTO);

                        if (XtraMessageBox.Show("Lưu dữ liệu thành công.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
                            this.Close();
                    }   
                    else
                        XtraMessageBox.Show("Lưu dữ liệu thất bại.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnHuy_Click(object sender, EventArgs e)
        {
            dtGiaoVien.Rows.Add(10, "ádasdasd");
            //if (XtraMessageBox.Show("Bạn có chắc chắn muốn thoát khỏi màn hình Thông Tin Lớp Học?\n Mọi thao tác của bạn sẽ không được lưu lại.",
            //                       "Thông báo!!!", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.OK)
            //    this.Close();
        }

        private void lookUpEditLoaiLopHoc_EditValueChanged(object sender, EventArgs e)
        {
            DevExpress.XtraEditors.LookUpEdit editor = (sender as DevExpress.XtraEditors.LookUpEdit);
            DataRowView row = editor.Properties.GetDataSourceRowByKeyValue(editor.EditValue) as DataRowView;
            if (row != null)
                txtChuongTrinhHoc.Text = row["TenChuongTrinh"].ToString();
        }

        private void lookUpEditGiaoVien_EditValueChanged(object sender, EventArgs e)
        {
            DevExpress.XtraEditors.LookUpEdit editor = (sender as DevExpress.XtraEditors.LookUpEdit);
            DataRowView row = editor.Properties.GetDataSourceRowByKeyValue(editor.EditValue) as DataRowView;
            if (row != null)
            {
                foreach (DataRow r in dtGiaoVien.Rows)
                {
                    if (r["MaGV"].ToString() == row["MaGV"].ToString())
                        return;
                }

                dtGiaoVien.Rows.Add(row["MaGV"], row["TenGV"]);

                gridCtrlGiaoVien.DataSource = dtGiaoVien;

                if (MaLopSelected != -1)
                {
                    int MaGiaoVienInsert = int.Parse(row["MaGV"].ToString());

                    if (lstMaGiaoVienDelete.Contains(MaGiaoVienInsert))
                        lstMaGiaoVienDelete.Remove(MaGiaoVienInsert);

                     foreach (DataRow r in dtGiaoVienTemp.Rows)
                     {
                        if (r["MaGV"].ToString() == row["MaGV"].ToString())
                        return;
                     }

                    if (!lstMaGiaoVienInsert.Contains(MaGiaoVienInsert))
                        lstMaGiaoVienInsert.Add(MaGiaoVienInsert);
                }
            }
        }

        private void repositoryItemButtonEditXoa_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            if (MaLopSelected != -1)
            {
                int MaGiaoVienDelete = int.Parse(gridViewGiaoVien.GetDataRow(gridViewGiaoVien.FocusedRowHandle)["MaGV"].ToString());

                if (!lstMaGiaoVienDelete.Contains(MaGiaoVienDelete))
                    lstMaGiaoVienDelete.Add(MaGiaoVienDelete);

                if (lstMaGiaoVienInsert.Contains(MaGiaoVienDelete))
                    lstMaGiaoVienInsert.Remove(MaGiaoVienDelete);
            }

            dtGiaoVien.Rows.Remove(gridViewGiaoVien.GetDataRow(gridViewGiaoVien.FocusedRowHandle));

            gridCtrlGiaoVien.DataSource = dtGiaoVien;
        }

        private void gridViewGiaoVien_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (e.Column.FieldName == "STT")
                e.DisplayText = (e.ListSourceRowIndex + 1).ToString();
        }
    }
}